//
//  HMPhotoView.swift
//  HMWeiBo
//
//  Created by Apple on 16/8/3.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit
import SDWebImage

/*
    1. 根据图片的数量 返回产品要求的效果
    2. 自定义Cell

*/

// 配图视图距离 view的间距
private let HMPhotoViewMargin: CGFloat = 10
// 配图里的cell/item他的间距
private let HMPhotoItemMargin: CGFloat = 5
// 配图里的Cell/Item的宽和高
private let HMPhotoItemWH: CGFloat = (UIScreen.mainScreen().bounds.width - 2 * HMPhotoViewMargin - 2 * HMPhotoItemMargin) / 3

private let HMPhotoViewReuseIdentifier = "HMPhotoViewReuseIdentifier"

class HMPhotoView: UICollectionView {
 
    // 定义一个数组,用来接收数据
    var pic_urls: [HMPhotoModel]?{
    
        didSet{
            
            // 计算一下行和高
           let size = calcViewSize()
            
            // 把宽和高赋值给 self
            // 找到之前设置的约束,然后更新一下
            self.snp_updateConstraints { (make) -> Void in
                make.width.equalTo(size.width)
                make.height.equalTo(size.height)
            }
            
            // 当数据发生改变的时候,要刷新数据
            reloadData()
            
        }
        
    }
    
    var flowLayout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    
    // 这个是 UICollectionView 的指定构造函数,因为要给他指定布局
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        
        super.init(frame: frame, collectionViewLayout: flowLayout)
        
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    //MARK:-- 计算行高的方法
    // 黑盒方法 -- 返回值是什么,我们先随便返回,至于里边的逻辑,待我们实现了效果之后,再补充
    private func calcViewSize() -> CGSize {
        
        // 根据图片的数量
        let count = pic_urls?.count
        
        if count == 1 {
          
            // 去 沙盒里 拿单张图片
            
            // 1. 先获取url
            let urlString = pic_urls?.first?.thumbnail_pic
            // 2. 根据SD 查找图片
            let image = SDWebImageManager.sharedManager().imageCache.imageFromDiskCacheForKey(urlString)
            
            // 3. 根据图片 来返回图片的大小 ; 为了确保安全, 我们判断一下
            if image != nil {
                // 设置一下图片的宽度,如果太窄了,让他宽一点,太宽了,窄一点
                var size = image.size
                
                // 如果太窄了,让他宽一点
                if size.width < 50 {
                    
                    let width: CGFloat = 50
                    // 图片的宽度修改了, 高度 也应该按照宽高比 放大
                    let height = 50 / size.width * size.height
                    
                    size.width = width
                    size.height = height
                    
                }
                // 返回的图片大小 和 实际 是视图展示大小不一致
                flowLayout.itemSize = size
                
                return size
            }
            
            
            // 单张图片,必须先下载,
            // 下载完成之后,再返回图片的大小
            
            // 这个属于一个特殊情况,我们可以先给他一个随便的值
            return CGSizeMake(HMPhotoItemWH, HMPhotoItemWH)
        } else {
            // 注意Cell的重用问题!!!!!!!!!!!!
            flowLayout.itemSize = CGSizeMake(HMPhotoItemWH, HMPhotoItemWH)
        }
        
        if count == 4 {
            
            let wh = HMPhotoItemWH * 2 + HMPhotoItemMargin
            
            return CGSizeMake(wh, wh)
        }
        
        // 2 3 
        if count == 2 || count == 3 {
            
            
            return CGSizeMake(UIScreen.mainScreen().bounds.width - 2 * HMPhotoViewMargin, HMPhotoItemWH)
        }
        // 5 6
        if count == 5 || count == 6 {
            
            return CGSizeMake(UIScreen.mainScreen().bounds.width - 2 * HMPhotoViewMargin, (HMPhotoItemWH + HMPhotoItemMargin ) * 2 )
            
        }
        //7 8 9
        
        if count == 7 || count == 8 || count == 9 {
             return CGSizeMake(UIScreen.mainScreen().bounds.width - 2 * HMPhotoViewMargin, (HMPhotoItemWH + HMPhotoItemMargin ) * 3 )
            
        }
        
        return CGSizeZero
//        return CGSizeMake(200, 200)
    }
    
    //MARK:-- 添加子控件和约束
    private func setupUI(){
        
        dataSource = self
        delegate = self
        
        // 注册cell
        self.registerClass(HMPhotoViewCell.self, forCellWithReuseIdentifier: HMPhotoViewReuseIdentifier)
        
        // 设置itemSize
        flowLayout.itemSize = CGSizeMake(HMPhotoItemWH, HMPhotoItemWH)
        
        flowLayout.minimumInteritemSpacing = HMPhotoItemMargin
        flowLayout.minimumLineSpacing = HMPhotoItemMargin
    }
    
    //MARK:-- 懒加载

}

extension HMPhotoView: UICollectionViewDataSource,UICollectionViewDelegate {
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return pic_urls?.count ?? 0
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(HMPhotoViewReuseIdentifier, forIndexPath: indexPath) as! HMPhotoViewCell
        
        cell.model = pic_urls![indexPath.item]
        
//        cell.backgroundColor = RandomColor()
        
        return cell
    }
    
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        
        // 传图片数据过去,而且传点击的那个图片
        // pic_urls -- 图片数组
        // indexPath.item -- 那个点击了
        
        guard let picurls = pic_urls else {
            return
        }
        
        let userInfo: [String: AnyObject] = ["picurls": picurls,"index": indexPath.item]
        // 发一个通知给控制器
        NSNotificationCenter.defaultCenter().postNotificationName(kNotificationShowPhotoBrower, object: nil, userInfo: userInfo)
        
        
    }
}

//MARK:-- 自定义Cell -> 需要改2个地方 注册cell,返回cell
class HMPhotoViewCell: UICollectionViewCell {
    // MVVM
    var model: HMPhotoModel? {
    
        didSet{
            
         iconImageView.sd_setImageWithURL(NSURL(string: model?.thumbnail_pic ?? ""))
            
        }
        
    }
    
    // 第一步: 重写父类的构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 第二步: 定义一个添加子类和设置子类控件约束的方法
    private func setupUI(){
        
        contentView.addSubview(iconImageView)
        
        iconImageView.snp_makeConstraints { (make) -> Void in
            
            
            make.edges.equalTo(contentView.snp_edges)
            
        }
        
    }
    
    //第三步: 懒加载控件
    //MARK:-- 懒加载控件
    private lazy var iconImageView: UIImageView = {
    
        let img = UIImageView()
        
        // 图片的填充模式 -- 默认
//        img.contentMode = .ScaleAspectFill
        
        return img
        
    }()
}
